home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / TUTORIAL / 0855.ZIP / 87ERROR.ASM < prev    next >
Assembly Source File  |  2000-01-02  |  2KB  |  63 lines

  1. ROM    SEGMENT AT 0F000H        ;ROM NMI AT 0F000H:0E2C3H
  2.     ORG    0E2C3H
  3. ROMADR    LABEL    FAR
  4. ROM    ENDS
  5. CODE    SEGMENT    PARA
  6.     ASSUME    CS:CODE,DS:CODE
  7.     ORG    100H        ;NEEDED FOR A .COM FILE
  8. START    PROC    FAR
  9.     JMP    DONE        ;INSTALL PROGRAM AND RETURN TO DOS
  10. XFER    DW    ?        ;8087 - 8088 XFER AREA
  11. DISPLAY    DW    0B000H        ;START OF DISPLAY SEGMENT
  12. ERROR:    PUSH    AX        ;SAVE REGISTERS USED ON USERS STACK
  13.     PUSH    BX
  14.     PUSH    DS
  15.     PUSH    ES
  16.     MOV    AX,CS        ;POINT DS AT CS
  17.     MOV    DS,AX
  18.     MOV    ES,DISPLAY    ;POINT ES AT START OF DISPLAY MEMORY
  19.     DB    0DBH,0E1H    ;DISABLE 8087 INTERRUPT WITH ERROR PENDING
  20.     ESC    2FH,XFER    ;CHECK 8087 FOR ERRORS
  21.     DB    9BH,0DBH,0E2H    ;CLEAR 8087 EXCEPTION FLAGS
  22.     DB    9BH,0DBH,0E0H    ;ENABLE 8087 INTERRUPTS AGAIN
  23.     MOV    BL,BYTE PTR XFER    ;GET LOW BYTE WITH EXCEPTION FLAGS
  24.     MOV    AH,70H        ;REVERSE VIDEO ATTRIBUTE FOR CHARACTER
  25.     RCR    BL,1D        ;GET NEXT ERROR FLAG
  26.     JNC    D        ;JUMP IF NO INVALID OPERATION
  27.     MOV    AL,'I'
  28.     MOV    ES:[2*79D],AX    ;WRITE ERROR FLAG TO SCREEN
  29. D:    RCR    BL,1D        ;GET NEXT ERROR FLAG
  30.     JNC    Z        ;JUMP IF NO DENORMALIZED OPERAND
  31.     MOV    AL,'D'
  32.     MOV    ES:[2*78D],AX    ;WRITE ERROR FLAG TO SCREEN
  33. Z:    RCR    BL,1D        ;GET NEXT ERROR FLAG
  34.     JNC    O        ;JUMP IF NO DIVIDE BY ZERO
  35.     MOV    AL,'Z'
  36.     MOV    ES:[2*77D],AX    ;WRITE ERROR FLAG TO SCREEN
  37. O:    RCR    BL,1D        ;GET NEXT ERROR FLAG
  38.     JNC    U        ;JUMP IF NO OVERFLOW
  39.     MOV    AL,'O'
  40.     MOV    ES:[2*76D],AX    ;WRITE ERROR FLAG TO SCREEN
  41. U:    RCR    BL,1D        ;GET NEXT ERROR FLAG
  42.     JNC    P        ;JUMP IF NO UNDERFLOW
  43.     MOV    AL,'U'
  44.     MOV    ES:[2*75D],AX    ;WRITE ERROR FLAG TO SCREEN
  45. P:    RCR    BL,1D        ;GET NEXT ERROR FLAG
  46.     JNC    EXIT        ;JUMP IF NO PRECISION ERROR
  47.     MOV    AL,'P'
  48.     MOV    ES:[2D*154D],AX    ;WRITE ERROR FLAG TO SCREEN
  49. EXIT:    POP    ES        ;RESTORE REGISTERS USED
  50.     POP    DS
  51.     POP    BX
  52.     POP    AX
  53.     JMP    FAR PTR ROMADR    ;JUMP TO NMI IN ROM TO FINISH UP
  54. DONE:    MOV    DX,OFFSET ERROR    ;OFFSET OF ERROR CODE
  55.     MOV    AH,25H
  56.     MOV    AL,2H        ;NMI
  57.     INT    21H        ;MOVE INTERRUPT VECTOR INTO TABLE
  58.     MOV    DX,OFFSET DONE
  59.     INT    27H        ;TERMINATE BUT STAY RESIDENT
  60. START    ENDP
  61. CODE    ENDS
  62.     END    START
  63.